#include<stdio.h>  
#include<easyx.h>
#include<graphics.h>
#include<Windows.h>
#include<mmsystem.h>
#include<math.h>
#pragma comment(lib,"winmm.lib")

int p = 0;

int map[20][20] = { 0 };
//为区分黑棋与白棋做准备

void initGame()
//游戏准备工作
{
	
	initgraph(700, 500); 
	//绘制游戏窗口

	setbkcolor(RGB(115, 251, 253));
	cleardevice();
	//设置背景颜色
	
	IMAGE img;
	loadimage(&img, "12.jpg");
	putimage(0, 0, &img);
	//设置背景图片

	setlinecolor(BLACK);
	for (int i = 0; i < 20; i++)
	{
		
		line(0, i * 25, 500, i * 25);
		line(i*25, 0, i*25, 500);
		
	}
	line(500, 0, 500, 500);
	//画出棋盘格子

	
	setbkmode(0);
	settextcolor(BLACK);
	outtextxy(520, 20, "玩家1：白棋");
	outtextxy(520, 70, "玩家2：黑棋");
	//添加游戏备注

	
	mciSendString("open 55.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm", NULL, 0, NULL);
	//添加游戏背景音乐
	mciSendString("setaudio bgm volume to 150", NULL, 0, NULL);
	//调节游戏背景音乐的音量


}


int judge(int MAPX, int MAPY)
//判断游戏的胜出方

{
	
	for (int u = MAPX - 4; u <= MAPX; u++)
	{
		if ((u>=1)&&(u<16)&&(map[u][MAPY] ==1)&& (map[u + 1][MAPY] == 1 )&&
			(map[u + 2][MAPY] == 1) && (map[u + 3][MAPY] == 1) && (map[u+ 4][MAPY] == 1))
		{
			return 1;
		}
	}
	//判断白色棋子横行连成五颗胜出
	
	
	for (int u = MAPX - 4; u <= MAPX; u++)
	{
		if ((u >= 1) && (u < 16) && (map[u][MAPY] == 2) && (map[u + 1][MAPY] == 2) && 
			(map[u + 2][MAPY] == 2) && (map[u + 3][MAPY] == 2) && (map[u + 4][MAPY] == 2))
		{
			return 2;
		}
	}
	//判断黑色棋子横行连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX][u] == 1) && (map[MAPX][u+1] == 1) &&
			(map[MAPX][u+4] == 1) && (map[MAPX][u+2] == 1) && (map[MAPX][u+3] == 1))
		{
			return 1;
		}
	}
	//判断白色棋子竖列连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX][u] == 2) && (map[MAPX][u + 1] == 2) 
			&& (map[MAPX][u + 4] == 2) && (map[MAPX][u + 2] == 2) && (map[MAPX][u + 3] == 2))
		{
			return 2;
		}
	}
	//判断黑色棋子竖列连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX+(u-MAPY)][u] == 1) && (map[MAPX + (u - MAPY+1)][u + 1] == 1) &&
			(map[MAPX + (u - MAPY)+4][u + 4] == 1) && (map[MAPX + (u - MAPY)+2][u + 2] == 1) && 
			(map[MAPX + (u - MAPY)+3][u + 3] == 1))
		{
			return 1;
		}
	}
	//判断白棋左上右下斜线连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX + (u - MAPY)][u] == 2) && (map[MAPX + (u - MAPY + 1)][u + 1] == 2) &&
			(map[MAPX + (u - MAPY) + 4][u + 4] == 2) && (map[MAPX + (u - MAPY) + 2][u + 2] == 2)
			&& (map[MAPX + (u - MAPY) + 3][u + 3] == 2))
		{
			return 2;
		}
	}
	//判断黑棋左上右下斜线连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX - (u - MAPY)][u] == 1) && (map[MAPX - (u - MAPY + 1)][u + 1] == 1) &&
			(map[MAPX - (u - MAPY) - 4][u + 4] == 1) && (map[MAPX - (u - MAPY) - 2][u + 2] == 1) 
			&& (map[MAPX - (u - MAPY)-  3][u + 3] == 1))
		{
			return 1;
		}
	}
	//判断白棋右上左下斜线连成五颗胜出

	
	for (int u = MAPY - 4; u <= MAPY; u++)
	{
		if ((u >= 1) && (u < 16) && (map[MAPX - (u - MAPY)][u] == 2) && (map[MAPX - (u - MAPY + 1)][u + 1] == 2) &&
			(map[MAPX - (u - MAPY) - 4][u + 4] == 2) && (map[MAPX -(u - MAPY) - 2][u + 2] == 2) 
			&& (map[MAPX - (u - MAPY) - 3][u + 3] == 2))
		{
			return 2;
		}
	}
	//判断黑棋右上左下斜线连成五颗胜出


};


void playGame()
//开始游戏
{
	MOUSEMSG Msg;
	int L = 0;
	int M = 0;
	int MAPX ;
	int MAPY;
	
	while (1) {
		Msg = GetMouseMsg();
		//捕捉鼠标位置
		
		for (int i = 1; i < 20; i++)
		{
			for (int j = 1; j < 20; j++)
			{
				if (abs(Msg.x - j * 25) < 12 && abs(Msg.y - i * 25) < 12)
				{
					L = j * 25;
					M = i * 25;
					MAPX = j;
					MAPY = i;

				}
			}
		}
		printf("X=%d,Y=%d\n", L, M);
		//优化鼠标位置

		
		if (Msg.uMsg == WM_LBUTTONDOWN)
			//设置左键单击为玩家一走棋区分两个玩家

		{
			setfillcolor(WHITE);
			//设置玩家一棋子为白色棋子

			solidcircle(L, M, 10);
			//画出点击后的白色棋子

			p = 0;
			//区分两位玩家

			map[MAPX][MAPY] = 1;
			//标记白色棋子的位置方便完成胜利的判断

			if (judge(MAPX, MAPY) == 1)
				
				//调用判断胜利的函数在每次白色棋子下完后判断其是否胜利
			{

				mciSendString("open 44.mp3 alias bm", NULL, 0, NULL);
				mciSendString("play bm", NULL, 0, NULL);
				//添加游戏胜利音乐
				mciSendString("setaudio bm volume to 150", NULL, 0, NULL);
				//调节游戏胜利音乐的音量
	
				MessageBox(NULL, "玩家1白棋胜利", "game over", MB_OK);
				//设置弹窗显示玩家一白棋胜利

			

				

				return;

			}

		}
		
		if (Msg.uMsg == WM_RBUTTONDOWN)
			//设置右键单击为玩家二走棋区分两个玩家
		{
			setfillcolor(BLACK);
			//将玩家二棋子设置为黑色进行区分
			
			solidcircle(L, M, 10);
			//画出鼠标右键单击位置的黑色棋子

			p = 1;
			//区分两个玩家

			map[MAPX][MAPY] = 2;
			//标记黑色棋子的位置方便完成后续黑色棋子是否胜利的判定
		


			if (judge(MAPX, MAPY) == 2)
				//调用判断胜利的函数在每次黑色棋子下完后判断其是否胜利

			{
				mciSendString("open 44.mp3 alias bg", NULL, 0, NULL);
				mciSendString("play bg", NULL, 0, NULL);
				//添加游戏胜利音乐
				mciSendString("setaudio bg volume to 150", NULL, 0, NULL);
				//调节游戏胜利音乐的音量

				MessageBox(NULL, "玩家2黑棋胜利", "game over", MB_OK);
				return;

				
				//设置弹窗显示玩家二黑棋胜利
				

			}
		}
		

	}
	
}




int main() {
	//程序主函数
	
	initGame();
	//调用游戏准备的函数
	
	playGame();
	//调用游戏开始的函数

	getchar();
	return 0;

}
